package rabbitMq

import (
	"bytes"
	"fmt"
	"log"
	"time"

	"github.com/streadway/amqp"
	"go.uber.org/zap"
)

var recvConn *amqp.Connection
var recvQueue amqp.Queue
var recvChannel *amqp.Channel

func RecvMsgFromRabbitMq() error {
	var err error
	// 1. 尝试连接RabbitMQ，建立连接
	// 该连接抽象了套接字连接，并为我们处理协议版本协商和认证等。
	recvConn, err = amqp.Dial("amqp://admin:admin@localhost:5672/")
	if err != nil {
		zap.L().Error("connect to RabbitMQ failed, err:", zap.Error(err))
		return err
	}
	defer recvConn.Close()

	// 2. 接下来，我们创建一个通道，大多数API都是用过该通道操作的。
	recvChannel, err = recvConn.Channel()
	if err != nil {
		zap.L().Error("open a channel failed, err:", zap.Error(err))
		return err
	}
	defer recvChannel.Close()

	err = recvChannel.Qos(
		1,     // prefetch count
		0,     // prefetch size
		false, // global
	)
	if err != nil {
		fmt.Printf("ch.Qos() failed, err:%v\n", err)
		return err
	}

	// 立即返回一个Delivery的通道
	msgs, err := recvChannel.Consume(
		"test_queue", // queue
		"",           // consumer
		false,        // 注意这里传false,关闭自动消息确认
		false,        // exclusive
		false,        // no-local
		false,        // no-wait
		nil,          // args
	)
	if err != nil {
		fmt.Printf("ch.Consume failed, err:%v\n", err)
		return err
	}

	// 开启循环不断地消费消息
	forever := make(chan bool)
	go func() {
		for d := range msgs {
			log.Printf("Received a message: %s", d.Body)
			dotCount := bytes.Count(d.Body, []byte("."))
			t := time.Duration(dotCount)
			time.Sleep(t * time.Second)
			log.Printf("Done")
			d.Ack(false) // 手动传递消息确认
		}
	}()

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever
	return nil
}
